// 1.引入events模块并创建EventEmitter对象
const events = require('events');
const eventEmitter = new events.EventEmitter();


// 2.EventEmitter Instance API
// on(event_name, listener)：注册监听器
eventEmitter.on('event_on', (arg) => {
  console.log('event1', arg);
});
eventEmitter.on('event_on', (arg) => {
  console.log('event2', arg);
});

// once(event_name, listener)：注册单次监听器
eventEmitter.once('event_once', (arg) => {
  console.log('event', arg);
});

// addListener(event_name, listener)：添加监听器
eventEmitter.addListener('event_add', (arg) => {
  console.log('event', arg);
});

// emit(event_name[, arg1, arg2...])：触发事件监听器，若存在事件监听则返回true，参数传递给监听器回调
for (let i = 0; i < 2; i++) {
  eventEmitter.emit('event_on', 'on');
  eventEmitter.emit('event_once', 'once');
  eventEmitter.emit('event_add', 'add');
}
// 输出结果：event1 on - event2 on - event once - event add - event1 on - event2 on - event add

// setMaxListeners(count)：设置监听器限制数量，默认10，超出数量时警告提示
eventEmitter.setMaxListeners(0);

// listenerCount(event_name)：获取指定事件的监听器数量
let count = eventEmitter.listenerCount('event_on');
console.log(count);// 2

// listeners(event_name)：获取指定事件的监听器数组
let eventArr = eventEmitter.listeners('event_on');
console.log(eventArr);// [ [Function (anonymous)], [Function (anonymous)] ]

// removeAllListeners([event_name])：移除监听器，若参数未指定事件名称则移除所有
console.log(eventEmitter.listenerCount('event_add'));// 1
eventEmitter.removeAllListeners('event_add');
console.log(eventEmitter.listenerCount('event_add'));// 0
console.log(eventEmitter.listenerCount('event_on'));// 2


// 3.EventEmitter Event
// newListener(event_name, listener)：添加监听器时触发
eventEmitter.on('newListener', () => {
  console.log('newListener');
});
eventEmitter.on('new_event_on', () => {
  console.log('new_event_on');
});
eventEmitter.once('new_event_once', () => {
  console.log('new_event_once');
});
eventEmitter.addListener('new_event_add', () => {
  console.log('new_event_add');
});
// 输出结果：newListener - newListener - newListener

// error：遇到异常时触发，当error被触发且无error的响应处理时该error使程序退出并在控制台输出错误信息
eventEmitter.emit('error');
// 输出结果：Error [ERR_UNHANDLED_ERROR]: Unhandled error. (undefined)